package com.javaee.demov2.utils.bean;


import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.metadata.OrderItem;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;

import javax.validation.constraints.Max;
import javax.validation.constraints.Min;

/**
 * description: 封装分页的参数,分页查询的dto需要继承该基类
 *
 * @author: hevean
 * @date: 2022/04/30
 */
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Slf4j
public class BasePageReq {
    /**
     * 最大分页记录
     */
    public final static int MAX_PAGESIZE = 200;
    /**
     * 默认分页记录
     */
    public final static int DEFAULT_PAGESIZE = 10;
    // 每页大小
    @Max(value = 200, message = "每页显示不超过200条记录")
    @Min(value = 1, message = "每页显示不能小于1")
    @ApiModelProperty(value = "分页大小,默认为10")
    private int pageSize = DEFAULT_PAGESIZE;
    // 当前页码
    @ApiModelProperty(value = "当前页,默认为第1页")
    private int current = 1;
    // 默认按照创建时间进行排序, 驼峰格式
    // 排序字段名
    @ApiModelProperty(value = "排序字段名")
    private String column = "created_time";
    // 排序顺序
    @ApiModelProperty(value = "排序方向，默认desc降序")
    private String order = "desc";

    /**
     * 如果当前页小于1，则取值为1
     */
    public int getCurrent() {
        if (this.current <= 0) {
            this.current = 1;
        }
        return this.current;
    }

    // 返回每页大小
    public int getPageSize() {
        if (this.pageSize <= 0 || this.pageSize > MAX_PAGESIZE) {
            this.pageSize = DEFAULT_PAGESIZE;
        }
        return this.pageSize;
    }

    /**
     * 构造mybatis-plus的分页查询对象,包括分页和排序功能的统一封装
     */
    public Page getPage() {
        // 创建分页对象
        Page page = new Page(this.current, this.pageSize);
        // 将前端传递过来的字段统一转换为下划线格式,此处使用hutool工具库
        if (StringUtils.isNotBlank(this.column)) {
            this.column = StrUtil.toUnderlineCase(this.column);
            log.info("转换后的字段名称为:%s", this.column);
            // 添加排序对象
            // element-ui传过来的排序字符串为ascending和descending
            if (this.order.startsWith("desc")) {
                page.addOrder(OrderItem.desc(this.column));
            } else if (this.order.startsWith("asc")) {
                page.addOrder(OrderItem.asc(this.column));
            }
        }else {
            // 默认排序方式,可以修改
            page.addOrder(OrderItem.asc("created_time"));
        }
        return page;
    }
}
